/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package infoplaces;

import java.awt.image.BufferedImage;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javaxt.io.*;
import plot.PlotIntegration;
import plot.Ponto;
import plot.Triangulacao;

/**
 *
 * @author jonas
 */
public class InfoPlaces {

    /**
     *
     */
    private final static String NOME_FOTO = "foto_tirada";
    private final static int    ALTURA_ARVORE = 2;
    private static ArrayList<Panorama> vencedores = new ArrayList<>();
    

    public static void main(String[] args) {
        
        Image image = new Image(NOME_FOTO + ".jpg");
        try {
            Panorama.salvarPano(ImageIO.read(new File(NOME_FOTO + ".jpg")), NOME_FOTO + ".png");
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        String longitude = "";
        String latitude  = "";
        
        double[] gps = image.getGPSCoordinate();

        if (gps != null) {
            longitude = String.valueOf(gps[0]);
            latitude = String.valueOf(gps[1]);
        } else {
            //TODO Abre Frame
        }
        
        
        TreeStreet tree = new TreeStreet(Server.getPanoIdOfXML(latitude, longitude), ALTURA_ARVORE);
        vencedores.clear();
        vencedores = tree.init_breadth_search();
        
        if(vencedores!= null){
            vencedores.get(0).criaHistogramaPanorama();
            vencedores.get(1).criaHistogramaPanorama();
            triangulacaoEPlot(tree.getListaPanoramas());
        } else {
            System.out.println("Nao encontrou dois vencedores");
            //TODO continua busca na arvore ateh certo limite
        }

    }
    
    private static void triangulacaoEPlot(ArrayList<Panorama> listaPanoramas){
        boolean vencedor;
        Panorama panoramaVencedor = vencedores.get(0);
        Panorama panoramaVice     = vencedores.get(1);
        for(Panorama pano: listaPanoramas){
            String id = pano.get_pano_id();
            vencedor = id.equals(panoramaVencedor.get_pano_id()) || id.equals(panoramaVice.get_pano_id());
            double grauComMaisMatches = pano.getHistograma() == null ? 0 : pano.getHistograma().getGrauComMaisMatches();
            PlotIntegration.save(id, pano.getLst_vizinhos(), pano.getLat(), pano.getLng(), grauComMaisMatches, vencedor);
        }
        
        Ponto pontoVencedor = new Ponto(panoramaVencedor.getLng(), panoramaVencedor.getLat());
        double anguloVencedor = panoramaVencedor.getHistograma().getGrauComMaisMatches();
        
        Ponto pontoViceVencedor = new Ponto(panoramaVice.getLng(), panoramaVice.getLat());
        double anguloViceVencedor = panoramaVice.getHistograma().getGrauComMaisMatches();
        
        Ponto alvo = Triangulacao.run(pontoVencedor, pontoViceVencedor, anguloVencedor, anguloViceVencedor);
        
        try{
             salvarLogTriangulacao(pontoVencedor, pontoViceVencedor, anguloVencedor, 
                anguloViceVencedor, alvo, panoramaVencedor.get_pano_id(), panoramaVice.get_pano_id());  
        } catch (Exception ex){
            ex.printStackTrace();
        }
        
        PlotIntegration.save("t", new ArrayList(), alvo.get_y(), alvo.get_x(), 0, true);
        
        PlotIntegration.createPlote();
    }
    
     private static void salvarLogTriangulacao(Ponto p1, Ponto p2, double a1, double a2, Ponto resultado, 
            String panoIdVencedor, String panoIdViceVencedor) {
        FileWriter fw = null;
        try {
            File arq = new File("temp/Log_Triangulacao.txt");
            fw = new FileWriter(arq);
            BufferedWriter bw = new BufferedWriter(fw);
            bw.write("Vencedor: " + panoIdVencedor);
            bw.newLine();
            bw.write("Lat = " + p1.get_y() + " Lng = " + p1.get_x());
            bw.newLine();
            bw.write("Direcao: " + a1);
            bw.newLine();
            bw.write("--------------");
            bw.newLine();
            bw.write("ViceVencedor: " + panoIdViceVencedor);
            bw.newLine();
            bw.write("Lat = " + p2.get_y() + " Lng = " + p2.get_x());
            bw.newLine();
            bw.write("Direcao: " + a2);
            bw.newLine();
            bw.write("--------------");
            bw.newLine();
            bw.write("Resultado da triangulacao: Lat = " + resultado.get_y() + " Lng = " + resultado.get_x());
            bw.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            try {
                fw.close();
            } catch (IOException ex) {
                  ex.printStackTrace();
            }
        }

    }
    
}
